LAMP之源码安装搭建

1. 介绍

LAMP是Linux + Apache + MySQL + PHP的简写,其实就是把Apache、MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的脚本语言,通常是网站。

我们可以把Apache+PHP安装在一台机器上,再把MySQL安装在另外一台机器上,也可以把它们三个安装在同一台机器上。但Apache和PHP需要在同一台机器上,这是因为PHP是作为Apache的一个模块存在的,它们两个必须在一起。

2. 安装

2.1. 安装MySQL

2.1.1. 实验版本

在平时安装MySQL都是源码包安装的,但是由于它的编译需要很长的时间,所以在这里选用二进制免编译包。目前比较常用的MySQL版本为mysql-5.6以上版本,但在工作场景中具体使用哪个版本还是根基具体的平台和需求而定。所以,在这里选用5.6版本的作为演示。

2.1.2. 下载软件包

可以到MySQL官网去下载MySQL的包。可以使用免编译二进制包。但是需要注意的是,这个软件包是区分平台的。CentOS7之前的版本都有区分32位和64位,但是如果使用的是CentOS7,那么直接选择64位的包下载。

查看Linux是多少位的方法:

1
2
[root@localhost ~]# uname -i
x86_64

下载源码包,如下所示:

1
2
# cd /usr/local/src/ #<==建议把所有的软件包都放在这个目录下面,方便管理
# wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz #<==下载MySQL安装包

2.1.3. 初始化

接下来的初始化过程如下:

1
2
3
4
5
6
7
8
9
10
# tar zxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz #<==解压
# [ -d /usr/local/mysql ] && mv /usr/local/mysql /usr/local/mysql_old
# mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql #<==挪动位置
# useradd -s /sbin/nologin mysql #<==建立mysql用户,因为启动MySQL需要该用户
# cd /usr/local/mysql #<==进入mysql目录
# mkdir -p /data/mysql #<==创建datadir,数据库文件会放到这里面
# chown -R mysql:mysql /data/mysql #<==更改文件属主和属组为mysql,不更改后续操作会出问题
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
# echo $?
0

上面的最后一个命令中,--user表示定义数据库以哪个用户的身份在运行,--datadir表示定义数据库的安装目录(建议放到大空间的分区上)。这个目录需要自行创建。这一步很关键,如果看到两个OK说明执行正确,否则请仔细查看错误信息。

在执行完最后上面的最后一条命令后,有时会有错误而执行失败。(即echo $?不为0)。

错误信息是这样的:

  • FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db: Data::Dumper,这是因为缺少包perl-Module-Install,使用命令yum install -y perl-Module-Install安装它。
  • Installing MySQL system tables..../bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory,解决方法:yum install -y libaio
  • 如果还有其它错误,仔细查看错误信息,利用网络资源来解决。

2.1.4. 配置MySQL

首先复制配置文件,如下所示:

1
2
# cp support-files/my-default.cnf /etc/my.cnf
cp:是否覆盖"/etc/my.cnf"y

因为系统默认就有/etc/my.cnf,所以会提示是否覆盖,直接按y即可。然后打开配置文件,做一些简单的配置,把配置文件改成如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# vim /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
log_bin = localhost
# These are commonly set, remove the # and set as required.
basedir = /usr/local/mysql
datadir = /data/mysql
port = 3306
server_id = 128
socket = /tmp/mysql.sock
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

其中,basedir是MySQL包所在的路径,datadir是定义的存放数据的地方,默认情况下,错误日志也会记录在这个目录下面。port定义MySQL服务监听的端口,如果不定义默认就是3306。server_id定义该MySQL服务的ID号,这个参数用在做主从配置的时候。socket定义MySQL服务监听的套接字地址,在Linux系统下面,很多服务不仅可以监听一个端口(通过TCP/IP的方式通信),也可以监听socket,两个进程就可以通过这个socket文件通信。下面几个buffer是关于内存的配置参数,保持默认即可。

然后复制启动脚本文件并修改其属性,如下所示:

1
2
# cp support-files/mysql.server /etc/init.d/mysqld
# chmod 755 /etc/init.d/mysqld

然后修改启动脚本(vim /etc/init.d/mysqld)。需要修改的地方有basedir=/usr/local/mysqldatadir=/data/mysql(前面初始化数据库时定义的目录)。把启动脚本加入系统服务项,设定开机启动并启动MySQL,如下所示:

1
2
3
4
5
# chkconfig --add mysqld #<==把mysqld服务加入到系统服务列表中
# chkconfig mysqld on #<==使其开机启动
# service mysqld start #<==启动服务
Starting MySQL.Logging to '/data/mysql/localhost.localdomain.err'.
.. SUCCESS!

如果启动不了,请到/data/mysql/目录下查看错误日志,这个日志名通常是主机名.err。检查MySQL是否启动的命令为:

1
2
3
4
# ps aux | grep mysql | grep -v grep
#<==显示结果应该大于2行
# netstat -lnp | grep 3306 #<==看看有没有监听3306端口
tcp 0 0 :::3306 :::* LISTEN 1904/mysqld

2.2. 安装Apache

2.2.1. 实验版本

Apache其实是一个软件基金会组织的名字,早期他们开发的Web Server软件非常流行,当时名字就焦作Apache,不过后来改名字叫作httpd了。所以,大家所说的Apache其实就是在说httpd。Apache基金会下面有很多开源的软件,其中就包含了Tomcat。

可以到httpd的官网去下载合适的版本,目前使用较多的版本为2.2或者2.4。在这里选用2.4版本来进行演示。不过2.4版本有一个比较麻烦的事情,还需要手动编译安装apr以及apr-util包。其中apr(包含apr和apr-util)可以理解成一个通用的函数库,主要为上层应用提供支持。在这里,httpd是依赖apr和apr-util的,如果不安装这两个东西,httpd就无法工作。

2.2.2. 下载软件包

首先下载所需要的安装包并解压

1
2
3
4
5
6
7
# cd /usr/local/src/
# wget http://mirrors.shu.edu.cn/apache//httpd/httpd-2.4.29.tar.gz
# wget http://mirrors.hust.edu.cn/apache/apr/apr-1.6.3.tar.gz
# wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
# tar zxvf httpd-2.4.29.tar.gz
# tar zxvf apr-1.6.3.tar.gz
# tar zxvf apr-util-1.6.1.tar.gz

2.2.3. 准备工作

接下来先安装apr以及apr-util

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# cd /usr/local/src/apr-1.6.3
# ./configure --prefix=/usr/local/apr
# echo $?
0
# make && make install
# echo $?
0
# cd /usr/local/src/apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# echo $?
0
# make && make install
# echo $?
0

如果在安装apr-util时出现如下错误:

1
libtool: link: cannot find the library `/usr/local/src/apr-util-1.6.1/xml/expat/libexpat.la' or unhandled argument `/usr/local/src/apr-util-1.6.1/xml/expat/libexpat.la'

解决办法是:yum install -y expat-devel

2.2.4. 正式安装

安装完apr及apr-util,继续安装httpd,配置编译参数,如下所示:

1
2
3
4
5
6
7
8
9
# cd /usr/local/src/httpd-2.4.29
# ./configure \
--prefix=/usr/local/apache2.4 \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-so \
--enable-mods-shared=most
# echo $?
0

这里,–prefix指定安装目录,–enable-so表示启用DSO。DSO的意思是,把某些功能以模块(一个模块就是一个so文件,这些文件在编译完httpd后就会看到)的形式展现出来。enable-mods-shared=most表示以共享的方式安装大多数功能模块,安装后会在modules目录下面看到这些文件。因为选择了大多数,所以后面的编译时间就会大大增加。

另外,为了避免在make的时候出现错误,最好提前安装好一些库文件:yum install -y pcre pcre-devel

最后编译和安装:

1
2
3
4
5
6
# make
# echo $?
0
# make install
# echo $?
0

安装完成后,可以执行下面的命令,查看httpd的目录结构以及modules目录下面的模块文件:

1
2
3
4
# ls /usr/local/apache2.4/
bin cgi-bin error icons logs manual
build conf htdocs include man modules
# ls /usr/local/apache2.4/modules/ #<==下面有很多绿色的.so文件,也就是编译时定义了一个most参数

这些模块并不会全部加载,如果你想使用哪个模块,在配置文件里配置即可。插卡加载了哪些模块,使用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# /usr/local/apache2.4/bin/apachectl -M
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_event_module (static)
authn_file_module (shared)
authn_core_module (shared)
authz_host_module (shared)
authz_groupfile_module (shared)
authz_user_module (shared)
authz_core_module (shared)
access_compat_module (shared)
auth_basic_module (shared)
reqtimeout_module (shared)
filter_module (shared)
mime_module (shared)
log_config_module (shared)
env_module (shared)
headers_module (shared)
setenvif_module (shared)
version_module (shared)
unixd_module (shared)
status_module (shared)
autoindex_module (shared)
dir_module (shared)
alias_module (shared)

说明:

  • 前面以AH0058开头的行,并不是错误,仅仅是一个警告,可在配置文件中定义ServerName使其消失。
  • 这些带有shared字样的,表示该模块为动态共享模块
  • 当然还有statix字样的,它表示以静态的形式存在。
  • 动态和静态的区别在于,静态模块直接和主程序(/usr/local/apache2.4/bin/httpd)绑定在一起,我们看不到,而动态的模块都是一个个独立存在的文件(modules目录下面的.so文件即是)。
  • 其中以mpm_开头的就是apache的mpm工作模式,2.2版本的httpd默认的mpm工作模式为prefork。除了prefork外,常见的工作模式还有worker以及event。2.4版本的httpd默认是event工作模式。

2.2.5. apache安装完后的服务启动设置

Apache安装后可通过其安装路径的bin目录下的apachectl脚本控制服务的启动和停止。服务控制脚本为:/usr/local/apache2.4/bin/apachectl

  • 启动Apache服务:/usr/local/apache2.4/bin/apachectl start
  • 停止Apache服务:/usr/local/apache2.4/bin/apachectl stop
  • 开机执行启动命令:echo "/usr/local/apache2.4/bin/apachectl start" >> /etc/rc.local

下面接受如何把Apache加入到系统服务,用service命令来控制Apache的启动和停止:

  • 首先以apachectl脚本为模板生成Apache服务控制脚本:grep -v "#" /usr/local/apache2.4/bin/apachectl > /etc/init.d/apache
  • 编辑Apache服务控制脚本/etc/init.d/apache,在文件的最前面插入下面的内容,使其支持chkconfig命令:

    1
    2
    3
    #!/bin/sh
    # chkconfig: 2345 85 15
    # description: Apache is a World Wide Webserver.
  • 保存退出后,增加Apache服务控制脚本执行权限:chmod +x /etc/init.d/apache

  • 将Apache服务加入到系统服务列表:chkconfig --add apache
  • 检查Apache服务是否成功加入:chkconfig --list apache
    • 命令输出类似这种:apache 0:off 1:off 2:on 3:on 4:on 5:on 6:off表明成功
  • 可使用service命令控制Apache的启动和停止
    • 启动Apache服务:service apache start
    • 停止Apache服务:service apache stop
    • 开机自启动Apache的运行级别为3、5:chkconfig --level 35 apache on
    • 关闭开机自启动:chkconfig apache off

2.2.6. 关于apache的几个用法

  • /usr/local/apache2.4/bin/apachectl -t 检查配置文件是否有错误
  • /usr/local/apache2.4/bin/apachectl -l 查看有哪些静态模块
  • /usr/local/apache2.4/bin/apachectl -M 查看有哪些动态模块
  • cat /usr/local/apache2.4/build/config -nice 查看现在正在使用的apache编译时的参数
  • /usr/local/apache2.4/bin/apachectl start 启动apache服务
  • /usr/local/apache2.4/bin/apachectl stop 关闭apache服务
  • /usr/local/apache2.4/bin/apachectl restart 重启apache服务
  • /usr/local/apache2.4/bin/apachectl graceful 不停止服务重新加载配置文件

2.3. 安装PHP

2.3.1. 实验版本

为什么要把PHP放在最后来安装,是有原因的,因为我们在编译PHP的时候,有指定MySQL以及Apache的路径,如果不事先安装好MySQL和Apache就没有办法安装PHP。而Apache和MySQL的安装顺序就无所谓了。

关于PHP的版本,目前大多数企业都会使用5.4版本及更高版本,甚至越来越多的企业使用PHP7版本。7和5两个版本还是有很大差异的,据说7版本有很大的性能提升,但是毕竟7版本还是太新了,和很多企业的网站不一定能兼容。所以,在本实验中还是以5版本为主,用的是5.6的版本。可以去PHP的官网去下载。

2.3.2. 下载软件包

首先下载和解压PHP源码包,如下所示:

1
2
3
# cd /usr/local/src/
# wget http://hk2.php.net/distributions/php-5.6.34.tar.gz
# tar zxf php-5.6.34.tar.gz

2.3.3. 编译安装时错误的总结

在执行编译参数这一步时可能会遇到很多错误,只有把这些错误全部解决才能正确进行下一步。下面是常见的一些错误及其解决办法:

总的来说,对于一台新机器,只需要安装上在编译过程中要用到的东西便能正常成功安装,总结下面的各个错误,只需要执行一条命令即可把所有的这些东西都安装上:yum install -y libxml2-devel openssl openssl-devel bzip2 bzip2-devel libpng libpng-devel freetype freetype-devel libmcrypt-devel libjpeg-devel

  • 错误1
    • configure: error: xml2-config not found. Pleasen check your libxml2 installation.
    • 解决办法:yum install -y libxml2-devel
  • 错误2
    • configure: error: Cannot find OpenSSL’s < evp.h>
    • 解决办法:yum install -y openssl openssl-devel
  • 错误3
    • checking for BZip2 in default path… not found
    • configure: error: Please reinstall the BZip2 distribution
    • 解决办法:yum install -y bzip2 bzip2-devel
  • 错误4
    • configure: error: png.h not found
    • 解决办法:yum install -y libpng libpng-devel
  • 错误5
    • configure: error: freetype.h not found.
    • 或 configure: error: freetype-config not found.
    • 解决办法:yum install -y freetype freetype-devel
  • 错误6
    • configure: error: mcrypt.h not found. Please reinstall libmcrypt.
    • 解决办法:yum install -y epel-releaseyum install -y libmcrypt-devel
    • CentOS默认的yum源没有libmcrypt-devel这个包,所以只能借助epel yum源
  • 错误7
    • configure: error: libjpeg.(a/so) not found.
    • 或 configure: error: jpeglib.h not found.
    • 解决办法:yum install -y libjpeg-devel

2.3.4. 最后的编译安装

解决编译时出现的所有错误后,就可以成功配置编译参数了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# cd php-5.6.34
# ./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2.4/bin/apxs \
--with-config-file-path=/usr/local/php/etc \
--with-mysql=/usr/local/mysql \
--with-libxml-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-iconv-dir \
--with-zlib-dir \
--with-bz2 \
--with-openssl \
--with-mcrypt \
--enable-soap \
--enable-gd-native-ttf \
--enable-mbstring \
--enable-sockets \
--enable-exif \
--disable-ipv6
# echo $?
0

关于PHP的编译参数比较多,暂时不需要钻牛角尖,但是大体意思是:编译PHP可以指定我们需要的功能额模块,跟Apache的类似。至于需要哪些,这取决于你所在的公司需要什么功能。上面提供的这些比较常用,如果没有特殊需求,直接使用这些参数即可。有一个地方需要注意一下,apxs为httpd的一个工具,因为有它才会自动把PHP模块安装到httpd的modules目录下,也就是说PHP将会以一个模块的形式和httpd结合在一起工作。

然后是编译和安装,如下所示:

1
2
3
4
5
6
7
# make #<==编译的时间可能有些长,得大概五分钟以上,耐心等待即可
# echo $?
0
# make test #<==编译完后建议执行这一步,也可以省略这一步,因为这一步很花时间
# make install #<==安装
# echo $?
0

然后复制配置文件:cp php.ini-production /usr/local/php/etc/php.ini

  • 补充
    • PHP的配置模板有两个,php.ini-productionphp.ini-development,前者是生产环境中使用的,后者是开发环境中使用的
    • /usr/local/php/bin/php不能用来启动PHP服务,但是它可以用来解析PHP脚本。(注意,在LAMP中PHP不是独立的服务,所以不用启动PHP相关的服务)
    • /usr/loca/php/bin/php -m 查看加载了哪些模块
    • /usr/local/php/bin/php -i 查看PHP的一些信息(比如编译PHP的时候的详细参数、配置文件路径、phpinfo()等)

2.4. 配置httpd支持PHP

httpd的主配置文件为/usr/local/apache2.4/conf/httpd.conf,编辑这个文件:vim /usr/local/apache2.4/conf/httpd.conf

  • 搜索ServerName,把#ServerName www.example.com:80前面的井号删除,并修改成ServerName localhost:80
  • 找到如下内容:

    1
    2
    3
    4
    <Directory />
    AllowOverride none
    Require all denied
    </Directory>
  • 改成如下:修改它的目的是,允许所有的请求,如果不设置该行,则我们访问的时候会报403错误。

    1
    2
    3
    4
    <Directory />
    AllowOverride none
    Require all granted
    </Directory>
  • 再搜索这一行AddType application/x-gzip .gz .tgz,在该行下面添加一行:

    1
    Addtype application/x-httpd-php .php
  • 接着再找到下面这一段:

    1
    2
    3
    <IfModule dir_module>
    DirectoryIndex index.html
    </IfModule>
  • 修改成:

    1
    2
    3
    <IfModule dir_module>
    DirectoryIndex index.html index.php
    </IfModule>
  • 找到

    1
    #ServerName www.example.com:80
  • 修改成:

    1
    ServerName localhost:80

2.5. 测试LAMP是否成功

httpd、MySQL和PHP安装之后,需要先检验httpd的配置文件是否正确,只有配置正确才可以正确解析PHP文件。

2.5.1. 测试配置文件是否正确

启动httpd之前需要先检验配置文件是否正确,如下所示:

1
2
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK

显示Syntax OK则说明配置正确。否则,需要修改配置文件httpd.conf。

启动httpd:/usr/local/apache2.4/bin/apachectl start

查看是否启动的命令如下:

1
2
# netstat -lnp | grep httpd
tcp 0 0 :::80 :::* LISTEN 85564/httpd

如果显示这一行则说明已经启动了httpd。

另外,我们也可以使用curl命令进行简单的测试,如下所示:

1
2
# curl localhost
<html><body><h1>It works!</h1></body></html>

如果显示了这一行则说明测试成功。

2.5.2. 测试是否正确解析PHP

Apache是把PHP作为一个模块来调用的,所以可以通过查看apache是否加载了PHP相关的模块:ls /usr/local/apache/modules/libphp5.so

首先编写一个测试脚本,如下所示:

1
2
3
4
# vim /usr/local/apache2.4/htdocs/1.php
<?php
echo "PHP解析正常!\n"
?>

保存脚本后继续测试,如下所示:

1
2
# curl localhost/1.php
PHP解析正常!

如果显示以上信息则说明PHP解析正确。

2.5.3. 用浏览器通过IP访问

可以用浏览器来访问该Linux主机的IP,比如,IP为192.168.1.111,那么在浏览器输入:http://192.168.1.111/1.php,看是否能够访问到。

如果不能访问,请检查Linux的防火墙和SeLinux设置:

  • iptables -nvL 如果有一些规则,则请执行下面命令来清除规则
  • iptables -Fservice iptables save
  • 关闭SeLinux:setenforce 0

到此为止,我们把LAMP环境搭建好了。其实仅仅是安装上了软件,我们还有很多具体的配置工作要做,所以需要多多练习配置httpd和PHP。下面的内容,便是具体的用法。应该熟悉httpd的配置。


3. 补充内容:Apache解析不了PHP的解决步骤

  • 第一步:检查Apache是否加载了PHP的模块
  • 第二步:若上一步没有问题,则检查Apache中是否正确配置与PHP相关的配置语句
  • 第三步:若上面的步骤都没有问题,则检测是否重启Apache服务
  • 第四步:若还没有解决,则查看相关日志记录,查看防火墙和SELinu等配置是否正确
0%